package main
import (
	"fmt"
)
//接口的注意事项和细节
/*
1、接口本身不能创建实例，但是可以指向一个实现了该接口的自定义类型的变量（实例）
2、接口中所有的方法都没有方法体，即都是没有实现的方法。
3、在Golang中，一个自定义类型需要将某个接口的所有方法都实现，我们说这个自定义类型实现了该接口。
4、一个自定义类型只有实现了某个接口，才能将该自定义类型的实例（变量）赋给接口类型。
5、只要是自定义数据类型，就可以实现接口，不仅仅是结构体类型。************
6、一个自定义类型可以实现多个接口
7、Golang接口中不能有任何变量
8、一个接口（比如A接口）可以继承多个别的接口（比如BCD接口），这时如果要实现A接口，也必须将BCD接口的方法全部实现!!!****
9、interface是一个引用类型！是一个指针，如果对interface初始化就使用，那么会出现 nil  ！
10、空接口interface{}没有任何方法，所以所有类型都实现了空接口！即我们可以把任何一个变量赋值给空接口。

*/

func main(){
	var person Person   //由于结构体变量实现了Interface接口的SayHello()方法
	var i Interface = person  //所以可以将person 赋值给接口变量
	i.SayHello()
	var i22 Interface2 = person  //所以可以将person 赋值给接口变量  person实现的第二个接口
	i22.SayHello2()


	var integer Integer = 520
	var i2 Interface = integer
	i2.SayHello()

	//可以把任何一个变量赋值给空接口
	var t T = person
	fmt.Println(t)
	var num float64 = 8.8
	t = num
	fmt.Println(t)
}


type Interface interface{
	SayHello()
}
type Interface2 interface{
	SayHello2()
}
type Person struct{

}
func (p Person)SayHello(){
	fmt.Println("hello !")
}
func (p Person)SayHello2(){
	fmt.Println("hello2 !")
}
//5、
type Integer int 
func (i Integer)SayHello(){
	fmt.Println("hello you are :",i)
}

//8、接口的继承
type A interface{
	AA()
}
type B interface{
	BB()
}
type C interface{  //要实现C接口就得把A B接口都实现！！！！
	A 
	B 
	CC()
}

//空接口
type T interface{

}